/**
 * @description 使用选择排序算法对数字数组进行排序。
 * @param {*} arr 
 * @returns 
 */
const selectionSort = (arr) => {
  // 克隆原始数组，避免污染
  const a = [...arr];
  for (let i = 0; i < a.length; i++) {
    // Array.prototype.slice() 切割出当前选择元素
    // Array.prototype.reduce() 找出子数组当前元素右侧最小元素的索引
    const min = a
      .slice(i + 1)
      .reduce((acc, val, j) => (val < a[acc] ? j + i + 1 : acc), i);
    // 进行交换
    if (min !== i) [a[i], a[min]] = [a[min], a[i]];
  }
  return a;
};

selectionSort([5, 1, 4, 2, 3]); // [1, 2, 3, 4, 5]

// val, a[acc]
// 1 5
// 4 1
// 2 1
// 3 1
// 4 5
// 2 4
// 3 2
// 5 4
// 3 4
// 4 5
